package bt.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import bt.excepcion.DAOExcepcion;
import bt.excepcion.LoginExcepcion;
import bt.modelo.Postulante;
import bt.util.ConexionBD;

public class PostulanteDAO extends BaseDAO {

	public void insertar(Postulante bt) throws DAOExcepcion {
		String query = "INSERT INTO Postulante(nombre, apellido, idSexo, fechaNacimiento, idPaisNacimiento, idEstadoCivil, emailPrincipal, emailSecundario, direccion, idPais, idDepartamento, telefonoCasa, telefonoMovil, discapacitado, dni, password, fechaRegistro, estado) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, bt.getNombre());
			stmt.setString(2, bt.getApellido());
			stmt.setInt(3, bt.getIdSexo());
			stmt.setString(4, bt.getFechaNacimiento());
			stmt.setInt(5, bt.getIdPaisNacimiento());
			stmt.setInt(6, bt.getIdEstadoCivil());
			stmt.setString(7, bt.getEmailPrincipal());
			stmt.setString(8, bt.getEmailSecundario());
			stmt.setString(9, bt.getDireccion());
			stmt.setInt(10, bt.getIdPais());
			stmt.setInt(11, bt.getIdDepartamento());
			stmt.setString(12, bt.getTelefonoCasa());
			stmt.setString(13, bt.getTelefonoMovil());
			stmt.setInt(14, bt.getDiscapacitado());
			stmt.setString(15, bt.getDni());
			stmt.setString(16, bt.getPassword());
			stmt.setString(17, bt.getFechaRegistro());
			stmt.setInt(18, bt.getEstado());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public void actualizar(Postulante bt) throws DAOExcepcion {
		String query = "UPDATE Postulante SET nombre=?,apellido=?,idSexo=?,fechaNacimiento=?,idPaisNacimiento=?,idEstadoCivil=?,emailPrincipal=?,emailSecundario=?,direccion=?,idPais=?,idDepartamento=?,telefonoCasa=?,telefonoMovil=?,discapacitado=?,dni=?,password=?,fechaRegistro=?,estado=? WHERE idPostulante=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, bt.getNombre());
			stmt.setString(2, bt.getApellido());
			stmt.setInt(3, bt.getIdSexo());
			stmt.setString(4, bt.getFechaNacimiento());
			stmt.setInt(5, bt.getIdPaisNacimiento());
			stmt.setInt(6, bt.getIdEstadoCivil());
			stmt.setString(7, bt.getEmailPrincipal());
			stmt.setString(8, bt.getEmailSecundario());
			stmt.setString(9, bt.getDireccion());
			stmt.setInt(10, bt.getIdPais());
			stmt.setInt(11, bt.getIdDepartamento());
			stmt.setString(12, bt.getTelefonoCasa());
			stmt.setString(13, bt.getTelefonoMovil());
			stmt.setInt(14, bt.getDiscapacitado());
			stmt.setString(15, bt.getDni());
			stmt.setString(16, bt.getPassword());
			stmt.setString(17, bt.getFechaRegistro());
			stmt.setInt(18, bt.getEstado());
			stmt.setInt(19, bt.getIdPostulante());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public void eliminar(int idPostulante) throws DAOExcepcion {
		String query = "DELETE FROM Postulante WHERE idPostulante=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idPostulante);

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Postulante obtener(int idPostulante) throws DAOExcepcion {
		Postulante bt = new Postulante();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT idPostulante,nombre,apellido,idSexo,fechaNacimiento,idPaisNacimiento,idEstadoCivil,emailPrincipal,emailSecundario,direccion,idPais,idDepartamento,telefonoCasa,telefonoMovil,discapacitado,dni,password,fechaRegistro,estado FROM Postulante WHERE idPostulante=? AND estado=1";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idPostulante);
			rs = stmt.executeQuery();
			if (rs.next()) {
				bt.setIdPostulante(rs.getInt("idPostulante"));
				bt.setNombre(rs.getString("nombre"));
				bt.setApellido(rs.getString("apellido"));
				bt.setIdSexo(rs.getInt("idSexo"));
				bt.setFechaNacimiento(rs.getString("fechaNacimiento"));
				bt.setIdPaisNacimiento(rs.getInt("idPaisNacimiento"));
				bt.setIdEstadoCivil(rs.getInt("idEstadoCivil"));
				bt.setEmailPrincipal(rs.getString("emailPrincipal"));
				bt.setEmailSecundario(rs.getString("emailSecundario"));
				bt.setDireccion(rs.getString("direccion"));
				bt.setIdPais(rs.getInt("idPais"));
				bt.setIdDepartamento(rs.getInt("idDepartamento"));
				bt.setTelefonoCasa(rs.getString("telefonoCasa"));
				bt.setTelefonoMovil(rs.getString("telefonoMovil"));
				bt.setDiscapacitado(rs.getInt("discapacitado"));
				bt.setDni(rs.getString("dni"));
				bt.setPassword(rs.getString("password"));
				bt.setFechaRegistro(rs.getString("fechaRegistro"));
				bt.setEstado(rs.getInt("Estado"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return bt;
	}

	public Collection<Postulante> listar() throws DAOExcepcion {
		Collection<Postulante> lista = new ArrayList<Postulante>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT nombre,apellido,idSexo,fechaNacimiento,idPaisNacimiento,idEstadoCivil,emailPrincipal,emailSecundario,direccion,idPais,idDepartamento,telefonoCasa,telefonoMovil,discapacitado,dni,password,fechaRegistro,estado FROM Postulante";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Postulante bt = new Postulante();
				bt.setNombre(rs.getString("nombre"));
				bt.setApellido(rs.getString("apellido"));
				bt.setIdSexo(rs.getInt("idSexo"));
				bt.setFechaNacimiento(rs.getString("fechaNacimiento"));
				bt.setIdPaisNacimiento(rs.getInt("idPaisNacimiento"));
				bt.setIdEstadoCivil(rs.getInt("idEstadoCivil"));
				bt.setEmailPrincipal(rs.getString("emailPrincipal"));
				bt.setEmailSecundario(rs.getString("emailSecundario"));
				bt.setDireccion(rs.getString("direccion"));
				bt.setIdPais(rs.getInt("idPais"));
				bt.setIdDepartamento(rs.getInt("idDepartamento"));
				bt.setTelefonoCasa(rs.getString("telefonoCasa"));
				bt.setTelefonoMovil(rs.getString("telefonoMovil"));
				bt.setDiscapacitado(rs.getInt("discapacitado"));
				bt.setDni(rs.getString("dni"));
				bt.setPassword(rs.getString("password"));
				bt.setFechaRegistro(rs.getString("fechaRegistro"));
				bt.setEstado(rs.getInt("Estado"));

				lista.add(bt);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public Collection<Postulante> buscarPorNombre(String nombre)
			throws DAOExcepcion {
		String query = "SELECT idPostulante,nombre,apellido,idSexo,fechaNacimiento,idPaisNacimiento,idEstadoCivil,emailPrincipal,emailSecundario,direccion,idPais,idDepartamento,telefonoCasa,telefonoMovil,discapacitado,dni,password,fechaRegistro,estado FROM Postulante WHERE nombre like ? AND estado=1";
		Collection<Postulante> lista = new ArrayList<Postulante>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Postulante bt = new Postulante();
				bt.setNombre(rs.getString("nombre"));
				bt.setApellido(rs.getString("apellido"));
				bt.setIdSexo(rs.getInt("idSexo"));
				bt.setFechaNacimiento(rs.getString("fechaNacimiento"));
				bt.setIdPaisNacimiento(rs.getInt("idPaisNacimiento"));
				bt.setIdEstadoCivil(rs.getInt("idEstadoCivil"));
				bt.setEmailPrincipal(rs.getString("emailPrincipal"));
				bt.setEmailSecundario(rs.getString("emailSecundario"));
				bt.setDireccion(rs.getString("direccion"));
				bt.setIdPais(rs.getInt("idPais"));
				bt.setIdDepartamento(rs.getInt("idDepartamento"));
				bt.setTelefonoCasa(rs.getString("telefonoCasa"));
				bt.setTelefonoMovil(rs.getString("telefonoMovil"));
				bt.setDiscapacitado(rs.getInt("discapacitado"));
				bt.setDni(rs.getString("dni"));
				bt.setPassword(rs.getString("password"));
				bt.setFechaRegistro(rs.getString("fechaRegistro"));
				bt.setEstado(rs.getInt("Estado"));
				bt.setIdPostulante(rs.getInt("idPostulante"));

				lista.add(bt);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public Collection<Postulante> listarxCargo(int idCargo) throws DAOExcepcion {
		System.out.println("PostulanteDAO: listarxCargo()");
		Collection<Postulante> lista = new ArrayList<Postulante>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			StringBuffer query = new StringBuffer(
					"select a.idPostulante,a.nombre,a.apellido,a.idSexo,a.fechaNacimiento,a.idPaisNacimiento,a.idEstadoCivil,a.emailPrincipal,a.emailSecundario,a.direccion,a.idPais,a.idDepartamento,a.telefonoCasa,a.telefonoMovil,a.discapacitado,a.dni,a.password,a.fechaRegistro,a.estado ");
			query.append("from expectativalaboral e, postulante a where e.idPostulante = a.idPostulante ");
			query.append("  and e.idCargo = ? order by a.idPostulante desc ");

			stmt = (PreparedStatement) con.prepareStatement(query.toString());
			stmt.setInt(1, idCargo);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Postulante bt = new Postulante();
				bt.setNombre(rs.getString("nombre"));
				bt.setApellido(rs.getString("apellido"));
				bt.setIdSexo(rs.getInt("idSexo"));
				bt.setFechaNacimiento(rs.getString("fechaNacimiento"));
				bt.setIdPaisNacimiento(rs.getInt("idPaisNacimiento"));
				bt.setIdEstadoCivil(rs.getInt("idEstadoCivil"));
				bt.setEmailPrincipal(rs.getString("emailPrincipal"));
				bt.setEmailSecundario(rs.getString("emailSecundario"));
				bt.setDireccion(rs.getString("direccion"));
				bt.setIdPais(rs.getInt("idPais"));
				bt.setIdDepartamento(rs.getInt("idDepartamento"));
				bt.setTelefonoCasa(rs.getString("telefonoCasa"));
				bt.setTelefonoMovil(rs.getString("telefonoMovil"));
				bt.setDiscapacitado(rs.getInt("discapacitado"));
				bt.setDni(rs.getString("dni"));
				bt.setPassword(rs.getString("password"));
				bt.setFechaRegistro(rs.getString("fechaRegistro"));
				bt.setEstado(rs.getInt("Estado"));
				bt.setIdPostulante(rs.getInt("idPostulante"));

				lista.add(bt);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public Collection<Postulante> listarxSueldo(Double Sueldo)
			throws DAOExcepcion {
		System.out.println("PostulanteDAO: listarxSueldo()");
		Collection<Postulante> lista = new ArrayList<Postulante>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			StringBuffer query = new StringBuffer(
					"select a.idPostulante,a.nombre,a.apellido,a.idSexo,a.fechaNacimiento,a.idPaisNacimiento,a.idEstadoCivil,a.emailPrincipal,a.emailSecundario,a.direccion,a.idPais,a.idDepartamento,a.telefonoCasa,a.telefonoMovil,a.discapacitado,a.dni,a.password,a.fechaRegistro,a.estado ");
			query.append("from expectativalaboral e, postulante a where e.idPostulante = a.idPostulante ");
			query.append("  and e.sueldo = ? order by a.idPostulante desc ");

			stmt = (PreparedStatement) con.prepareStatement(query.toString());
			stmt.setDouble(1, Sueldo);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Postulante bt = new Postulante();
				bt.setNombre(rs.getString("nombre"));
				bt.setApellido(rs.getString("apellido"));
				bt.setIdSexo(rs.getInt("idSexo"));
				bt.setFechaNacimiento(rs.getString("fechaNacimiento"));
				bt.setIdPaisNacimiento(rs.getInt("idPaisNacimiento"));
				bt.setIdEstadoCivil(rs.getInt("idEstadoCivil"));
				bt.setEmailPrincipal(rs.getString("emailPrincipal"));
				bt.setEmailSecundario(rs.getString("emailSecundario"));
				bt.setDireccion(rs.getString("direccion"));
				bt.setIdPais(rs.getInt("idPais"));
				bt.setIdDepartamento(rs.getInt("idDepartamento"));
				bt.setTelefonoCasa(rs.getString("telefonoCasa"));
				bt.setTelefonoMovil(rs.getString("telefonoMovil"));
				bt.setDiscapacitado(rs.getInt("discapacitado"));
				bt.setDni(rs.getString("dni"));
				bt.setPassword(rs.getString("password"));
				bt.setFechaRegistro(rs.getString("fechaRegistro"));
				bt.setEstado(rs.getInt("Estado"));
				bt.setIdPostulante(rs.getInt("idPostulante"));

				lista.add(bt);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public Postulante validar(String correo, String clave) throws DAOExcepcion,
			LoginExcepcion {
		String query = "select idPostulante, nombre, apellido from postulante where emailPrincipal=? and password=?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Postulante vo = new Postulante();
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, correo);
			stmt.setString(2, clave);
			rs = stmt.executeQuery();

			if (rs.next()) {
				vo.setIdPostulante(rs.getInt("idPostulante"));
				vo.setNombre(rs.getString("nombre"));
				vo.setApellido(rs.getString("apellido"));
			} else {
				throw new LoginExcepcion("No existe");
			}
		} catch (LoginExcepcion e) {
			System.err.println(e.getMessage());
			throw new LoginExcepcion(e.getMessage());
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
}
